/**
 * 
 */
package com.hexacta.hrs.report;

import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;

/**
 * @author mfunes
 *
 */
public abstract class AbstractReport implements Report {

    /** Para usar cuando se imprimen fechas */
    protected static final SimpleDateFormat DATE_FORMAT = new java.text.SimpleDateFormat("dd/MM/yyyy");
    
	/**
	 *  Crea un PDF para el reporte indicado.
	 *  @return Un stream con el pdf.
	 */
	@SuppressWarnings("unchecked")
	protected ByteArrayOutputStream createPDF(String reportTemplateLocation, Map parameters, Collection dataSource) {
		try {
		    if(getReportParameters() != null){
		        parameters.putAll(getReportParameters());
		    }
			JasperReport jr = JasperCompileManager.compileReport(getClass().getClassLoader().getResourceAsStream(reportTemplateLocation));
			JasperPrint jp = JasperFillManager.fillReport(jr, parameters, new JRBeanCollectionDataSource(dataSource));
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			JasperExportManager.exportReportToPdfStream(jp, outputStream);
			return outputStream;
	        
        } catch (JRException e) {
            throw new RuntimeException(e);
        } 
	}
	
	/**
	 *  Crea un Excel para el reporte indicado.
	 *  @return Un stream con el excel.
	 */
	@SuppressWarnings("unchecked")
	protected ByteArrayOutputStream createExcel(String reportTemplateLocation, Map parameters, Collection dataSource){
		try {
		    if(getReportParameters() != null){
                parameters.putAll(getReportParameters());
            }
			JasperReport jr = JasperCompileManager.compileReport(getClass().getClassLoader().getResourceAsStream(reportTemplateLocation));
			JasperPrint jp = JasperFillManager.fillReport(jr, parameters, new JRBeanCollectionDataSource(dataSource));
			JExcelApiExporter xlsExporter = new JExcelApiExporter();
			xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT, jp);
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			xlsExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
			xlsExporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
			xlsExporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
			
			xlsExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
			xlsExporter.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
			xlsExporter.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE);
			
			xlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
			xlsExporter.exportReport();
			return outputStream;
        } catch (JRException e) {
            throw new RuntimeException(e);
        } 
	}
	
	/**
	 * Crea el template general que se va a usar en todos los reportes.
	 * Recibe como parametro en nombre del reporte asi lo puede poner como parametro.
	 * @param subReportName el nombre del reporte.
	 */
	/*
	 * private void createMasterTemplateReport(String subReportName){
		//TODO: Generate Code if necesary.
	}
	*/
	
	/**
	 * Implementar para obtener los datos necesarios para la generacion del reporte.
	 */
	@SuppressWarnings("unchecked")
	protected abstract Collection getReportData(Map<String, Object> filters);
	
	/**
	 * Implementar para obtener los parametros necesarios para la generacion del reporte.
	 */
	@SuppressWarnings("unchecked")
	protected abstract Map getReportParameters();
	
}
